# -*- coding: utf-8 -*-
#Modulos standars de django
import datetime
from django.shortcuts import render_to_response, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.template import RequestContext

#Modulos de usuario
from choices import tipo_usuario, tipo_dato, genero
from models import perfil,  slim_string, localidades, mensajes, amonestaciones #Modelos de datos propios...
from formularios import Flogin, Fregistracion, Fnewemail, Fperfil, Fchpass, Fmensaje, Favatar #Formularios propios
from decoradores import login_required, login_unrequired, under_construction
from funciones import exist, save, mail_activacion, newpass, chpass  #Funciones de trabajo
from mundofacu.settings import MEDIA_ROOT


#Definicion de Vistas llamadas desde usuarios/urls.py
def Vindex(request):
	return render_to_response('usuarios/index.html', {'title':"Portal",}, context_instance=RequestContext(request))


@login_unrequired
def Vregister(request): #registro de nuevos usuarios
	T = "Registracion de nuevos usuarios"
	if request.method == 'POST':
		if Fregistracion(request.POST).is_valid(): #Si los datos del form son validos, le haremos un par de controles necesarios nuestros....
			if " " in request.POST['username']: return render_to_response('form.html', {'form':Fregistracion(request.POST),'title': T,'down_line':'El usuario no puede contener caracteres especiales.', }, context_instance=RequestContext(request))
			elif request.POST['password1'] != request.POST['password2']: return render_to_response('form.html', {'form':Fregistracion(request.POST),'title': T,'down_line':'Las passwords son diferentes.', }, context_instance=RequestContext(request))
			elif exist(User,"username",request.POST["username"]): return render_to_response('form.html', {'form':Fregistracion(request.POST),'title': T,'down_line':'Usuario '+request.POST['username']+' Existe.', }, context_instance=RequestContext(request))
			elif exist(User,"email",request.POST["email"]): return render_to_response('form.html', {'form':Fregistracion(request.POST),'title': T,'down_line':'El E-mail ya pertenece a otro usuario', }, context_instance=RequestContext(request))
			else: #Si toods nuestros controles funcionaron, guardalo!
				usr = User(username=request.POST["username"],email=request.POST["email"].lower(),is_active=False, first_name=request.POST["nombre"], last_name=request.POST["apellido"])
				usr.set_password(request.POST["password1"])
				mail_activacion(usr.username, request.POST["password1"], usr.email)
				save(usr)
				save(perfil(user=usr))
				return render_to_response('save.html', {'usr':usr.username, "tipo":"Cuenta Creada", "exito":True,"msg":"Se le ha enviado a su cuenta de correo un mail con el link de activacion"}, context_instance=RequestContext(request))
		else: return render_to_response('form.html', {'form':Fregistracion(request.POST),'title': T,"tipo":"Cuenta Creada", }, context_instance=RequestContext(request))
	else: return render_to_response('form.html', {'form':Fregistracion(),'title': T,"tipo":"Cuenta Creada", }, context_instance=RequestContext(request))


def Vactive(request, usr,code): #Activacion de usuario registrado
	T="Activacion de usuarios"
	if exist(User,"username",usr):
		u = User.objects.get(username=usr)
		mail_code = 0
		for x in range(len(u.username)): mail_code+= ord(u.username[x])
		if mail_code == int(code):
			if not (u.is_active):
				u.is_active = True
				save(u)
				return render_to_response('save.html', {'usr':usr, "title":T,"tipo": "Cuenta Activada","exito":True,  }, context_instance=RequestContext(request))
			else: return render_to_response('error.html', {'title':"Activacion de usuarios", 'msg': 'El usuario ya esta activo.'}, context_instance=RequestContext(request))
		else: return render_to_response('error.html', {'title':"Activacion de usuarios", 'msg': 'El codigo de activacion es incorrecto.'}, context_instance=RequestContext(request))
	else: return render_to_response('error.html', {'title':"Activacion de usuarios", 'msg': 'El usuario que intenta activar no existe.'}, context_instance=RequestContext(request))


@login_unrequired
def Vlogin(request): #Login de usuarios
	T="Login"
	if request.method == 'POST':
		if Flogin(request.POST).is_valid():
			user = authenticate(username=request.POST["username"], password=request.POST["password"])
			if user is not None:
				if user.is_active:
					if not("remember" in request.POST.keys()): request.session.set_expiry(0)
					if amonestaciones.objects.filter(user= user, estado= 3).count() > 0: return redirect("/banned")
					elif amonestaciones.objects.filter(user= user, hasta__gte= datetime.date.today(), estado= 2).count() > 0:
						hasta= amonestaciones.objects.filter(user= user, hasta__gte= datetime.date.today(), estado= 2).all()[0].hasta
						return redirect("/suspendido/" + str(hasta.day) +"-"+ str(hasta.month) +"-"+ str(hasta.year))
					else:  login(request,user)
					if (request.path == "/usr/login") and (request.user.__class__.__name__ != "AnonymousUser"): return redirect("/")
					else: return redirect(request.path)
				else: return render_to_response('form.html',{'form': Flogin(request.POST),'title': T,'down_line':'Tu cuenta esta inactiva.', 'newpass': False, }, context_instance=RequestContext(request))
			else: return render_to_response('form.html',{'form': Flogin(request.POST),'title': T,'down_line':"Usuario o Contraseña incorrecta!", 'newpass': True, }, context_instance=RequestContext(request))
		else: return render_to_response('form.html',{'form': Flogin(request.POST),'title': T, }, context_instance=RequestContext(request))
	else: return render_to_response('form.html',{'form': Flogin(),'title': T, }, context_instance=RequestContext(request))


@login_required
def Vlogout(request): #Deslogeo de usuarios
	logout(request)
	return redirect('/')


@login_required #ARREGLAR!!! (Que sea dinamica por que si no, no vamos ni para adelante ni para atraz!)
def Vedit_profile(request): #Actualizacion del Perfil del usuario
	if request.method == 'POST':
		if Fperfil(request.POST).is_valid():
			if not(exist(perfil,"user",request.user)): save(perfil(user=request.user))
			profile = request.user.get_profile()
			if request.POST["localidad"] != "": profile.localidad=localidades.objects.get(id=request.POST["localidad"])
			if request.POST["nacimiento_year"] != "": profile.fecha_nacimiento=request.POST["nacimiento_year"]+"-"+request.POST["nacimiento_month"]+"-"+request.POST["nacimiento_day"]
			if request.POST["telefono"] != "": save(slim_string(user=request.user, tipo_dato="4",valor=request.POST["telefono"]))
			if request.POST["direccion"] != "": save(slim_string(user=request.user, tipo_dato="1",valor=request.POST["direccion"]))
			if request.POST["estado"] != "": save(slim_string(user=request.user, tipo_dato="2",valor=request.POST["estado"]))
			save(slim_string(user=request.user, tipo_dato="3",valor=request.POST["genero"]))
			save(profile)
			return render_to_response('save.html', {'usr':request.user.username, 'title': "Perfil","tipo": "Actualizacion del Perfil", "exito":True, }, context_instance=RequestContext(request))
		else: return render_to_response('form.html', {"form": Fperfil(request.POST), 'title': "Perfil", }, context_instance=RequestContext(request))
	else: return render_to_response('form.html', {"form": Fperfil(), 'title': "Perfil", }, context_instance=RequestContext(request))


def Vavatar(request):
	if request.method == 'POST':
		if Favatar(request.POST, request.FILES).is_valid():
			if request.FILES["foto"].name.split(".")[1].lower() in ["jpeg","jpg"]:
				pic = request.FILES["foto"].read()
				destination = open(MEDIA_ROOT +"/profiles/"+request.user.username + ".jpeg", 'wb+')
				destination.write(pic)
				return render_to_response('save.html', {'usr':request.user.username, 'title': "Avatar","tipo": "Actualizacion del avatar", "exito":True, }, context_instance=RequestContext(request))
			else: return render_to_response('error.html', {'title':"Cambio de avatar", 'msg': 'La imagen debe ser jpeg o jpg.'}, context_instance=RequestContext(request))
		else: return render_to_response('form.html', {"form": Favatar(request), 'title': "Avatar",'photo':'enctype="multipart/form-data"' }, context_instance=RequestContext(request))
	else: return render_to_response('form.html', {"form": Favatar(), 'title': "Avatar",'photo':'enctype="multipart/form-data"' }, context_instance=RequestContext(request))


@login_unrequired
def Vnewpass(request): #Pedido de nueva password
	T = "Pedido de nueva Password"
	if request.method == 'POST':
		if Fnewemail(request.POST).is_valid():
			if exist(User,"username",request.POST["username"]):
				u = User.objects.get(username=request.POST["username"])
				if u.email == request.POST["email"]:
					newpass(u)
					R= "Nueva password enviada a su cuenta de correo"
				else: R="Ese usuario no tiene ese Email asignado"
			else: R= "Usuario Inexistente"
			return render_to_response('form.html', {"form": Fnewemail(request.POST),'title': T,"down_line": R, }, context_instance=RequestContext(request))
		else: return render_to_response('form.html', {"form": Fnewemail(request.POST),'title': T , }, context_instance=RequestContext(request))
	else: return render_to_response('form.html', {"form": Fnewemail(),'title': T, }, context_instance=RequestContext(request))


@login_required
def Vchpass(request):
	T = "Cambiar la Password"
	if request.method == 'POST':
		if Fchpass(request.POST).is_valid():
			if request.POST["password1"] != request.POST["password2"]: return render_to_response('form.html', {"form": Fchpass(request.POST), 'title': T,"msg":"Las passwords deben ser iguales", }, context_instance=RequestContext(request))
			else:
				user = authenticate(username=request.user.username, password=request.POST["password"])
				if user is None: return render_to_response('form.html', {"form": Fchpass(request.POST), 'title': T,"msg":"La password actual es incorrecta", }, context_instance=RequestContext(request))
				else:
					chpass(user,request.POST["password1"])
					return render_to_response('save.html', {"title":T,"tipo": "Cambio de Password","exito":True, "msg":"Passwords cambiadas", }, context_instance=RequestContext(request))
		else: return render_to_response('form.html', {"form": Fchpass(request.POST), 'title': T, }, context_instance=RequestContext(request))
	else: return render_to_response('form.html', {"form": Fchpass(),'title': T, }, context_instance=RequestContext(request))


@login_required
def Vprofile(request,user):
	if exist(User,'id',user):
		user = User.objects.get(id=user)
		datos = user.get_profile().datos()
		threads= user.get_profile().get_threads(5)
		posts= user.get_profile().get_posts(5)
		return render_to_response('usuarios/profile.html', {'lista':datos, 'threads': threads, 'posts': posts, 'usuario':user, 'yo': request.user == user, 'e':True}, context_instance=RequestContext(request))
	else: return render_to_response('error.html', {'title':"Perfil de usuario", 'msg': 'No existe el usuario al que intenta acceder.'}, context_instance=RequestContext(request))


@login_required
def Vinbox(request):
	T= 'Bandeja de entrada'
	N= mensajes.objects.filter(receptor=request.user,leido=False, activo=True).all()
	L= mensajes.objects.filter(receptor=request.user,leido=True, activo=True).all()
	return render_to_response('usuarios/inbox.html', {'title': T, 'nuevos': N, 'leidos':L},context_instance=RequestContext(request))


@login_required
def Vermsg(request,id):
	if exist(mensajes,"id",id):
		m = mensajes.objects.get(id=id)
		if m.receptor == request.user:
			m.leido=True
			save(m)
			return render_to_response('usuarios/msg.html', {'msg':m},context_instance=RequestContext(request))
		else: return redirect('/hacker')
	else: return render_to_response('error.html', {'title':"Mensajeria Privada", 'msg': 'Esta intentando acceder a un mensaje inexistente.'}, context_instance=RequestContext(request))


@login_required
def Vmsgmod(request,accion,id):
	print ("entro")
	if exist(mensajes,"id",id):
		m = mensajes.objects.get(id=id)
		if accion=='1': m.leido=False
		if accion=='2': m.activo=False
		m.save()
		return redirect('/usr/inbox')
	else: return render_to_response('error.html', {'title':"Mensajeria Privada", 'msg': 'Esta intentando acceder a un mensaje inexistente.'}, context_instance=RequestContext(request))


@login_required
def Vsendmsg(request,destino):
	if exist(User,'id',destino):
		T= "Enviar mensaje privado: " + User.objects.get(id=destino).username
		if request.method == 'POST':
			if Fmensaje(request.POST).is_valid():
				mensajes(asunto=request.POST['asunto'],texto=request.POST['texto'], receptor=User.objects.get(id=destino),emisor=request.user).save()
				return render_to_response('save.html', {"title":T,"tipo": "Mensaje Privado","exito":True, "msg":"Mensaje enviado con exito", }, context_instance=RequestContext(request))
			else: return render_to_response('form.html', {'title': T,'form': Fmensaje(request.POST), }, context_instance=RequestContext(request))
		else: return render_to_response('form.html', {'title': T,'form': Fmensaje(), }, context_instance=RequestContext(request))
	else: return render_to_response('error.html', {'title':"Mensajeria privada", 'msg': 'No existe el usuario al que intenta enviarle un mensaje privado.'}, context_instance=RequestContext(request))